#ifndef __VSFLINUX_H_INCLUDED__
#define __VSFLINUX_H_INCLUDED__

#include <unistd.h>

int vsflinux_init(void);

struct vsflinux_thread_t
{
	int tid;
	int retval;
	struct vsfsm_thread_t *pending;
	struct vsfsm_thread_t *main;
	struct vsflist_t list;
};
struct vsfsm_thread_t *vsflinux_thread_get(int tid);
struct vsfsm_thread_t *vsflinux_thread_new(int priv_size, int stack_size,
		const struct vsfsm_thread_op_t *op);
void vsflinux_thread_on_terminate(struct vsfsm_thread_t *thread);

struct vsflinux_fd_t;
struct vsflinux_fdop_t
{
	int (*fcntl)(struct vsflinux_fd_t *sfd, int cmd, long arg);
	ssize_t (*read)(struct vsflinux_fd_t *sfd, void *buf, size_t count);
	ssize_t (*write)(struct vsflinux_fd_t *sfd, const void *buf, size_t count);
	int (*close)(struct vsflinux_fd_t *sfd);
};

struct vsflinux_fd_t
{
	int fd;
	int flags;
	const struct vsflinux_fdop_t *op;

	struct vsflinux_fd_cache_t
	{
		int type;
		struct vsf_fifo_t fifo;
	} cache;

	int txpend, rxpend;
	unsigned txevt : 1;
	unsigned rxevt : 1;
	unsigned cache_dynalloced : 1;
	unsigned locked : 1;
	struct vsflist_t list;
	int priv[0];
};

struct vsflinux_vsfile_priv_t
{
	struct vsfile_t *file;
	uint64_t pos;
};
extern struct vsflinux_fdop_t vsflinux_vsfile_fdop;

int vsflinux_fd_new(struct vsflinux_fd_t **psfd, int priv_size,
		const struct vsflinux_fdop_t *op);
int vsflinux_fd_del(struct vsflinux_fd_t *sfd);
struct vsflinux_fd_t *vsflinux_fd_get(int fd);
int vsflinux_fd_alloc_cache(struct vsflinux_fd_t *sfd, int size);
int vsflinux_fd_free_cache(struct vsflinux_fd_t *sfd);
int vsflinux_fd_fcntl(struct vsflinux_fd_t *pfd, int cmd, long arg);

int vsflinux_fd_tx_pend(struct vsflinux_fd_t *sfd);
int vsflinux_fd_rx_pend(struct vsflinux_fd_t *sfd);
int vsflinux_fd_tx_sendevt(struct vsflinux_fd_t *sfd);
int vsflinux_fd_rx_sendevt(struct vsflinux_fd_t *sfd);

int vsflinux_execv(int (*entry)(int argc, char *argv[]), char *const argv[]);
int vsflinux_execl(int (*entry)(int argc, char *argv[]), ...);

#endif	// __VSFLINUX_H_INCLUDED__
